package com.zwl.sjzmanagement.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import static org.springframework.security.config.Customizer.withDefaults;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
//        http
//                .authorizeHttpRequests(authorize -> authorize
//                        .requestMatchers("/public/**").permitAll()  // 新版本写法
//                        .requestMatchers(HttpMethod.GET, "/**").permitAll()  // 允许GET请求
//                        .anyRequest().authenticated()
//                )
//                .httpBasic(withDefaults());
        http
                .authorizeHttpRequests(authorize -> authorize
                        .anyRequest().permitAll()  // 允许所有请求（包括GET、POST等）
                )
                .csrf().disable()  // 禁用CSRF防护（前后端分离项目通常需要）
                .httpBasic().disable()  // 禁用HTTP Basic认证
                .formLogin().disable();  // 禁用表单登录
        return http.build();
    }
}
/**
 *         http
 *             // 关闭 CSRF（前后端分离场景）
 *             .csrf().disable()
 *             // 关闭默认认证方式（与自定义 Token 认证不冲突）
 *             .httpBasic().disable()
 *             .formLogin().disable()
 *             // 配置接口权限
 *             .authorizeHttpRequests(authorize -> authorize
 *                 // 公开接口：登录接口、公共资源
 *                 .requestMatchers(HttpMethod.POST, "/login").permitAll() // 允许登录接口的 POST 请求
 *                 .requestMatchers("/public/**").permitAll() // 公共资源路径
 *                 // 受保护接口：需通过 Token 认证（由 AOP 处理）
 *                 .anyRequest().authenticated() // 其他接口需认证
 *
 *
 *                 三、与 AOP Token 验证的协作流程
 * 用户登录：
 * 前端发送 POST 请求到 /login，携带用户名密码。
 * 后端验证通过后，生成 MD5 Token 并返回（如在响应头或 Body 中）。
 * 后续请求：
 * 前端在请求头中携带 Token（如 Authorization: Bearer {token}）。
 * Spring Security 首先检查 authorizeHttpRequests 配置：发现接口需 authenticated()，允许请求进入过滤器链。
 * 请求到达你的 AOP 切面，验证 Token 的有效性（如解析 MD5、校验时效性）。
 * 若 Token 无效，AOP 抛出异常并返回 401 或 403 响应。
 */